package priv.conceit.study.leetcode.simple.official;

import java.util.Stack;

/**
 * 编号232
 * 用栈实现队列
 * <a href="https://leetcode-cn.com/problems/implement-queue-using-stacks/">
 * 使用栈实现队列的下列操作：
 * push(x) -- 将一个元素放入队列的尾部。
 * pop() -- 从队列首部移除元素。
 * peek() -- 返回队列首部的元素。
 * empty() -- 返回队列是否为空。
 *
 * 示例:
 * MyQueue queue = new MyQueue();
 * queue.push(1);
 * queue.push(2);
 * queue.peek();  // 返回 1
 * queue.pop();   // 返回 1
 * queue.empty(); // 返回 false
 *
 * 你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
 * 你所使用的语言也许不支持栈。你可以使用 list 或者 deque（双端队列）来模拟一个栈，只要是标准的栈操作即可。
 * 假设所有操作都是有效的 （例如，一个空的队列不会调用 pop 或者 peek 操作）
 *
 * 思路1
 * 使用主栈+辅助栈来完成
 * 辅助栈反转
 *
 *
 *
 * @author Conceit
 * @since 1.0.0, 2019/8/15
 */
public class ImplementQueueUsingStacks {

	public static void main(String[] args) {
		ImplementQueueUsingStacks implementQueueUsingStacks=new ImplementQueueUsingStacks();
		implementQueueUsingStacks.push(1);
		implementQueueUsingStacks.push(2);
		implementQueueUsingStacks.push(3);

		System.out.println(implementQueueUsingStacks.peek());
//		System.out.println(implementQueueUsingStacks.pop());
//		System.out.println(implementQueueUsingStacks.empty());
	}

	Stack<Integer> stack=new Stack<>();
	Stack<Integer> subsidiary=new Stack<>();

	/**
	 * 入队
	 *
	 * 如果
	 * 主栈为空 则直接push主存储
	 * 否则
	 * 主栈出栈 保存到副栈
	 * 新数据入主栈
	 * 副栈入主栈
	 *
	 * 类似
	 * 新增 3入主
	 * 1 2 入 辅助-1 2
	 * 辅助 在入 主-3 2 1
	 *
	 *
	 *
	 * @param x
	 */
	public void push(int x) {

		while (!stack.empty()){
			subsidiary.push(stack.pop());
		}
		stack.push(x);
		while (!subsidiary.empty()){
			stack.push(subsidiary.pop());
		}


	}

	/**
	 * 获取top元素并删除
	 *
	 * @return
	 */
	public int pop() {
		return stack.pop();
	}


	/**
	 * 获取top元素
	 *
	 * @return
	 */
	public int peek() {
		return stack.peek();
	}

	/**
	 * 查看栈是否为空
	 *
	 * @return
	 */
	public boolean empty() {
		return stack.empty();
	}

	public void print(Stack<Integer> stack){

	}
}
